#include "value_adjust_menu.h"
#include "menu_config.h"
#include "../Application/channel_output.h"

/* 调节步长宏定义 */
#define VOLTAGE_SHORT_STEP  100  /* 电压短按步长 100mV */
#define VOLTAGE_LONG_STEP   500  /* 电压长按步长 500mV */
#define CURRENT_SHORT_STEP  100  /* 电流短按步长 100μA */
#define CURRENT_LONG_STEP   500  /* 电流长按步长 500μA */

/* 通道类型定义 */
typedef enum {
    CHANNEL_TYPE_PWMDAC_VOLTAGE = 0,    /* PWMDAC电压输出 */
    CHANNEL_TYPE_DAC_CURRENT,           /* DAC电流输出 */
    CHANNEL_TYPE_PWMDAC_CURRENT,        /* PWMDAC电流输出 */
} ChannelType_e;

/* 通道信息结构体 */
typedef struct {
    uint8_t channel;                 /* 通道号 */
    ChannelType_e type;              /* 通道类型 */
    uint16_t minValue;               /* 最小值 */
    uint16_t maxValue;               /* 最大值 */
    uint32_t currentValue;           /* 当前值 */
    const char* unit;                /* 单位 */
} ChannelInfo_t;

/* 添加全屏刷新标志位 */
static bool needFullRefresh = true;
/* 显示刷新标志，决定是否需要重绘菜单界面 */
static bool sg_needRefresh = true;
/* 当前通道信息 */
static ChannelInfo_t sg_currentChannel;

/* 定义空的菜单项 */
static cotMenuList_t sg_ValueAdjustMenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_VALUE_ADJUST_MENU, NULL, NULL, NULL, NULL, "Value Adjust"),
};

/* 初始化通道信息 */
static void InitChannelInfo(uint8_t channel)
{
    sg_currentChannel.channel = channel;
    
    switch(channel)
    {
        case 1: /* PWMDAC通道1 - 电压输出 0-10000mV */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_VOLTAGE;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 10000;
            sg_currentChannel.currentValue = ChannelOutput_GetVoltage(1);
            sg_currentChannel.unit = "mV";
            break;
            
        case 2: /* PWMDAC通道2 - 电压输出 0-10000mV */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_VOLTAGE;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 10000;
            sg_currentChannel.currentValue = ChannelOutput_GetVoltage(2);
            sg_currentChannel.unit = "mV";
            break;
            
        case 3: /* PWMDAC通道3 - 电压输出 0-10000mV */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_VOLTAGE;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 10000;
            sg_currentChannel.currentValue = ChannelOutput_GetVoltage(3);
            sg_currentChannel.unit = "mV";
            break;
            
        case 4: /* PWMDAC通道4 - 电压输出 0-10000mV */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_VOLTAGE;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 10000;
            sg_currentChannel.currentValue = ChannelOutput_GetVoltage(4);
            sg_currentChannel.unit = "mV";
            break;
            
        case 5: /* DAC通道1 - 电流输出 0或4000-20000μA */
            sg_currentChannel.type = CHANNEL_TYPE_DAC_CURRENT;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 20000;
            sg_currentChannel.currentValue = ChannelOutput_GetCurrent(5);
            sg_currentChannel.unit = "uA";
            break;
            
        case 6: /* DAC通道2 - 电流输出 0或4000-20000μA */
            sg_currentChannel.type = CHANNEL_TYPE_DAC_CURRENT;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 20000;
            sg_currentChannel.currentValue = ChannelOutput_GetCurrent(6);
            sg_currentChannel.unit = "uA";
            break;
            
        case 7: /* PWMDAC通道3 - 电流输出 0或4000-20000μA */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_CURRENT;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 20000;
            sg_currentChannel.currentValue = ChannelOutput_GetCurrent(7);
            sg_currentChannel.unit = "uA";
            break;
            
        case 8: /* PWMDAC通道4 - 电流输出 0或4000-20000μA */
            sg_currentChannel.type = CHANNEL_TYPE_PWMDAC_CURRENT;
            sg_currentChannel.minValue = 0;
            sg_currentChannel.maxValue = 20000;
            sg_currentChannel.currentValue = ChannelOutput_GetCurrent(8);
            sg_currentChannel.unit = "uA";
            break;
            
        default:
            break;
    }
}

/* 应用当前值到硬件 */
static void ApplyCurrentValue(void)
{
    switch(sg_currentChannel.type)
    {
        case CHANNEL_TYPE_PWMDAC_VOLTAGE:
            ChannelOutput_SetVoltage(sg_currentChannel.channel, sg_currentChannel.currentValue);
            break;
            
        case CHANNEL_TYPE_DAC_CURRENT:
            ChannelOutput_SetCurrent(sg_currentChannel.channel, sg_currentChannel.currentValue);
            break;
            
        case CHANNEL_TYPE_PWMDAC_CURRENT:
            /* 通道7和8的电流调节实际上是调节通道3和4的电压 */
            if(sg_currentChannel.channel == 7)
            {
                /* 通道7电流调节：将电流值转换为电压值，然后设置通道3电压 */
                uint16_t voltage = (uint16_t)(sg_currentChannel.currentValue / 10); /* 电流/10 = 电压 */
                ChannelOutput_SetVoltage(3, voltage);
            }
            else if(sg_currentChannel.channel == 8)
            {
                /* 通道8电流调节：将电流值转换为电压值，然后设置通道4电压 */
                uint16_t voltage = (uint16_t)(sg_currentChannel.currentValue / 10); /* 电流/10 = 电压 */
                ChannelOutput_SetVoltage(4, voltage);
            }
            break;
            
        default:
            break;
    }
}

/* 显示函数 */
static void ShowValueAdjustMenu(cotMenuShow_t *ptShowInfo)
{
    /* 如果不需要刷新显示，直接返回 */
    if (!sg_needRefresh)
    {
        return;
    }

    /* 只有在首次显示或标记需要全刷时才清屏并绘制所有内容 */
    if (needFullRefresh)
    {
        /* 清屏 */
        LCD_Clear();

        /* 显示标题 */
        const char *pszSelectDesc = get_text((TextId_e)ptShowInfo->uMenuDesc.textId);
        uint16_t titleX = CALC_TITLE_CENTER_X(pszSelectDesc, LCD_W);
        LCD_ShowString(titleX, 0, (uint8_t *)pszSelectDesc, g_point_color, g_back_color, MENU_FONT_SIZE, 0);

        /* 画分隔线 */
        LCD_DrawLine(0, MENU_FONT_SIZE, LCD_W - 1, MENU_FONT_SIZE, g_point_color);

        /* 显示标签 */
        LCD_ShowString(10, 40, (uint8_t *)"Set:", g_point_color, g_back_color, 32, 0);
        LCD_ShowString(10, 110, (uint8_t *)"Rel:", g_point_color, g_back_color, 32, 0);

        needFullRefresh = false;
    }

    /* 显示设定值 */
    char valueStr[32];
    sprintf(valueStr, "%d%s    ", sg_currentChannel.currentValue, sg_currentChannel.unit);
    uint16_t valueX = 90;
    
    /* 显示设定值 */
    LCD_ShowString(valueX, 40, (uint8_t *)valueStr, g_point_color, g_back_color, 32, 0);
    
    /* 显示实际输出值 */
    float actualValue = ChannelOutput_GetActualOutput(sg_currentChannel.channel);
    char actualStr[32];
    if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_VOLTAGE)
        sprintf(actualStr, "%.2fV ", actualValue);
    else
        sprintf(actualStr, "%.2fmA ", actualValue);
    LCD_ShowString(valueX, 110, (uint8_t *)actualStr, g_point_color, g_back_color, 32, 0);
    
    sg_needRefresh = false;
}

/* 按键回调函数 - 上键(KEY0) */
static void OnKey0FunCB(cotKey_t key)
{
    uint16_t shortStep, longStep;
    
    /* 根据通道类型确定步长 */
    if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT)
    {
        shortStep = CURRENT_SHORT_STEP;
        longStep = CURRENT_LONG_STEP;
    }
    else
    {
        shortStep = VOLTAGE_SHORT_STEP;
        longStep = VOLTAGE_LONG_STEP;
    }
    
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 增加值 */
            uint16_t newValue = sg_currentChannel.currentValue + shortStep;
            if (newValue <= sg_currentChannel.maxValue)
            {
                /* 对于电流通道，检查是否在有效范围内 */
                if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT)
                {
                    if (newValue > 0 && newValue < 4000)
                    {
                        /* 如果新值在0-4000之间，强制设为4000 */
                        newValue = 4000;
                    }
                }
                sg_currentChannel.currentValue = newValue;
                ApplyCurrentValue();
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if ((sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT) && sg_currentChannel.currentValue == 0)
            {
                /* 电流从0直接跳到4000 */
                sg_currentChannel.currentValue = 4000;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按增加值 */
            uint16_t newValue = sg_currentChannel.currentValue + longStep;
            if (newValue <= sg_currentChannel.maxValue)
            {
                /* 对于电流通道，检查是否在有效范围内 */
                if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT)
                {
                    if (newValue > 0 && newValue < 4000)
                    {
                        /* 如果新值在0-4000之间，强制设为4000 */
                        newValue = 4000;
                    }
                }
                sg_currentChannel.currentValue = newValue;
                ApplyCurrentValue();
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if ((sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT) && sg_currentChannel.currentValue == 0)
            {
                /* 电流从0直接跳到4000 */
                sg_currentChannel.currentValue = 4000;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按上键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 下键(KEY1) */
static void OnKey1FunCB(cotKey_t key)
{
    uint16_t shortStep, longStep;
    
    /* 根据通道类型确定步长 */
    if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT)
    {
        shortStep = CURRENT_SHORT_STEP;
        longStep = CURRENT_LONG_STEP;
    }
    else
    {
        shortStep = VOLTAGE_SHORT_STEP;
        longStep = VOLTAGE_LONG_STEP;
    }
    
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 减少值 */
            uint16_t newValue = sg_currentChannel.currentValue;
            if (newValue >= sg_currentChannel.minValue + shortStep)
            {
                newValue -= shortStep;
                /* 对于电流通道，检查是否在有效范围内 */
                if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT)
                {
                    if (newValue > 0 && newValue < 4000)
                    {
                        /* 如果新值在0-4000之间，直接跳到0 */
                        newValue = 0;
                    }
                }
                sg_currentChannel.currentValue = newValue;
                ApplyCurrentValue();
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if (newValue > sg_currentChannel.minValue)
            {
                /* 处理小于最小步长的特殊情况，直接设为最小值 */
                sg_currentChannel.currentValue = sg_currentChannel.minValue;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
            else if ((sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT) && newValue == 4000)
            {
                /* 电流从4000直接跳到0 */
                sg_currentChannel.currentValue = 0;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按减少值 */
            uint16_t newValue = sg_currentChannel.currentValue;
            if (newValue >= sg_currentChannel.minValue + longStep)
            {
                newValue -= longStep;
                /* 对于电流通道，检查是否在有效范围内 */
                if (sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT)
                {
                    if (newValue > 0 && newValue < 4000)
                    {
                        /* 如果新值在0-4000之间，直接跳到0 */
                        newValue = 0;
                    }
                }
                sg_currentChannel.currentValue = newValue;
                ApplyCurrentValue();
                sg_needRefresh = true; /* 只标记局部刷新 */
            }
            else if (newValue > sg_currentChannel.minValue)
            {
                /* 如果不足长按步长，但大于最小值，则设为最小值 */
                sg_currentChannel.currentValue = sg_currentChannel.minValue;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
            else if ((sg_currentChannel.type == CHANNEL_TYPE_PWMDAC_CURRENT || sg_currentChannel.type == CHANNEL_TYPE_DAC_CURRENT) && newValue == 4000)
            {
                /* 电流从4000直接跳到0 */
                sg_currentChannel.currentValue = 0;
                ApplyCurrentValue();
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按下键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 确认键(KEY2) */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 参数已在ApplyCurrentValue中自动保存 */
            /* 返回上级菜单 */
            cotMenu_Exit(false);
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 参数已在ApplyCurrentValue中自动保存 */
            /* 保存参数并返回主菜单 */
            while (cotMenu_Exit(true) == 0)
            {
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按确认键松手时的处理 */
        }
    }
}

/* 进入回调函数 */
void OnValueAdjustMenuEnter(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 从pUserData获取通道号 */
    uint8_t channel = (uint32_t)(ptItemShowInfo->pExtendData);
    
    /* 初始化通道信息 */
    InitChannelInfo(channel);
    
    /* 绑定菜单表和显示函数 */
    cotMenu_Bind(sg_ValueAdjustMenuTable, COT_GET_MENU_NUM(sg_ValueAdjustMenuTable), ShowValueAdjustMenu);
    
    /* 应用初始值 */
    ApplyCurrentValue();
}

/* 加载回调函数 */
void LoadValueAdjustMenu(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 注册按键回调 */
    cotKey_Listen(KEY0, OnKey0FunCB);
    cotKey_Listen(KEY1, OnKey1FunCB);
    cotKey_Listen(KEY2, OnKey2FunCB);

    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY0, 800, 100); /* 上键长按0.8秒触发,每0.1秒重复一次 */
    cotKey_ConfigLongPressMode(KEY1, 800, 100); /* 下键长按0.8秒触发,每0.1秒重复一次 */
    cotKey_ConfigLongPressMode(KEY2, 3000, 0);  /* SET键长按3秒触发,不重复 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
}

/* 任务回调函数 */
void ValueAdjustMenuTask(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 预留：可在此添加菜单定时刷新、动画等功能 */
}

